home *** CD-ROM | disk | FTP | other *** search
/ Aminet 50 / Aminet 50 (2002)(GTI - Schatztruhe)[!][Aug 2002].iso / Aminet / dev / basic / BlitzLstMay02.lha / BlitzLstMay02 / attachments / mail_86 / 3d_rotation.asc
Text File  |  2002-06-09  |  5KB  |  207 lines

  1. ;
  2. ; 3D-rotation made easy. Copyright (C) Peter Thor 2002
  3. ; pettho-0@student.luth.se
  4. ;
  5.  
  6.   WBStartup
  7.   NoCli
  8.   DEFTYPE .q
  9.  
  10.   NEWTYPE .xyz
  11.     x.w
  12.     y.w
  13.     z.w
  14.   End NEWTYPE
  15.  
  16.   NEWTYPE .world
  17.     xang.q                            ; x- y- and z-angle world is rotated
  18.     yang.q
  19.     zang.q
  20.  
  21.     xx.q
  22.     xy.q
  23.     xz.q
  24.     yx.q
  25.     yy.q
  26.     yz.q
  27.     zx.q
  28.     zy.q
  29.     zz.q
  30.   End NEWTYPE
  31.  
  32.   Dim Object.xyz(8-1)                 ; unmodified object
  33.   Dim RotatedObject.xyz(8-1)          ; object after rotation
  34.  
  35.   For n.w = 0 To 8-1                  ; read in the points of the object
  36.     Read Object(n)\x
  37.     Read Object(n)\y
  38.     Read Object(n)\z
  39.   Next n
  40.  
  41.   Dim Axis_Active.b(3-1)              ; what axis to rotate about
  42.   Axis_Active(0) = False              ; x-axis
  43.   Axis_Active(1) = False              ; y-axis
  44.   Axis_Active(2) = False              ; z-axis
  45.  
  46.   win_width.w  = 100                  ; width and height of window
  47.   win_height.w = 100
  48.  
  49.   Dim XY_Origin.b(2-1)                ; x- and y-coordinate for "center of view"
  50.   XY_Origin(0)   = win_width / 2
  51.   XY_Origin(1)   = win_height / 2
  52.   
  53.   perspectivedepth.w = 320
  54.  
  55. ;--
  56.  
  57. Statement UpdateWorld {}
  58.  
  59.   SHARED World.world
  60.  
  61. ;--
  62.  
  63.   World\xx = Cos(World\yang)*Cos(World\xang)
  64.   World\xy = Cos(World\yang)*Sin(World\xang)
  65.   World\xz = Sin(World\yang)
  66.   World\yx = Cos(World\zang)*Sin(World\xang)+Sin(World\zang)*Sin(World\yang)*Cos(World\xang)
  67.   World\yy = -Cos(World\zang)*Cos(World\xang)+Sin(World\zang)*Sin(World\yang)*Sin(World\xang)
  68.   World\yz = -Sin(World\zang)*Cos(World\yang)
  69.   World\zx = Sin(World\zang)*Sin(World\xang)-Cos(World\zang)*Sin(World\yang)*Cos(World\xang)
  70.   World\zy = -Sin(World\zang)*Cos(World\xang)-Cos(World\zang)*Sin(World\yang)*Sin(World\xang)
  71.   World\zz = Cos(World\zang)*Cos(World\yang)
  72.  
  73. End Statement
  74.  
  75. ;--
  76.  
  77. Statement UpdateObject {xorigin.w, yorigin.w}
  78.  
  79.   SHARED World.world, Object(), RotatedObject()
  80.  
  81.   ;--
  82.  
  83.   For n.w = 0 To 8-1
  84.     nx.w = xorigin + World\xx * Object(n)\x + World\xy * Object(n)\y + World\xz * Object(n)\z
  85.     ny.w = yorigin + World\yx * Object(n)\x + World\yy * Object(n)\y + World\yz * Object(n)\z
  86.     nz.w =           World\zx * Object(n)\x + World\zy * Object(n)\y + World\zz * Object(n)\z
  87.  
  88.     RotatedObject(n)\x = nx
  89.     RotatedObject(n)\y = ny
  90.     RotatedObject(n)\z = nz
  91.   Next n
  92.  
  93. End Statement
  94.  
  95. ;--
  96.  
  97. Statement UpdatePerspective  {perspectivedepth.w}
  98.  
  99.   SHARED RotatedObject()
  100.  
  101.   ;--
  102.  
  103.   ; if perspectivedepth > 320 the object will be closer to the viewer
  104.   ;                     < 320 further away
  105.   For n.w = 0 To 8-1
  106.     RotatedObject(n)\x = (RotatedObject(n)\x*perspectivedepth)/(RotatedObject(n)\z + 320)
  107.     RotatedObject(n)\y = (RotatedObject(n)\y*perspectivedepth)/(RotatedObject(n)\z + 320)
  108.   Next n
  109.  
  110. End Statement
  111.  
  112.  
  113. Statement DrawObject {}
  114.  
  115.   SHARED RotatedObject()
  116.  
  117.   ;--
  118.  
  119.   For n.w = 0 To 8-1
  120.     If n < 3
  121.       Wline RotatedObject(n)\x,RotatedObject(n)\y,RotatedObject(n+1)\x,RotatedObject(n+1)\y,1
  122.     Else
  123.       Wline RotatedObject(0)\x,RotatedObject(0)\y,RotatedObject(3)\x,RotatedObject(3)\y,1
  124.     EndIf
  125.   Next n
  126.  
  127.   For n = 4 To 8-1
  128.     If n < 7
  129.       Wline RotatedObject(n)\x,RotatedObject(n)\y,RotatedObject(n+1)\x,RotatedObject(n+1)\y,1
  130.     Else
  131.       Wline RotatedObject(4)\x,RotatedObject(4)\y,RotatedObject(7)\x,RotatedObject(7)\y,1
  132.     EndIf
  133.   Next n
  134.  
  135.   Wline RotatedObject(0)\x,RotatedObject(0)\y,RotatedObject(6)\x,RotatedObject(6)\y,2
  136.   Wline RotatedObject(1)\x,RotatedObject(1)\y,RotatedObject(7)\x,RotatedObject(7)\y,2
  137.   Wline RotatedObject(2)\x,RotatedObject(2)\y,RotatedObject(4)\x,RotatedObject(4)\y,2
  138.   Wline RotatedObject(3)\x,RotatedObject(3)\y,RotatedObject(5)\x,RotatedObject(5)\y,2
  139.  
  140. End Statement
  141.  
  142. ;************************************************************************************
  143.  
  144.   WBenchToFront_
  145.   FindScreen 0
  146.  
  147.   Window 0,10,10,100,80,$2|$8,"",0,1
  148.   GTCheckBox 0,0,0, 0,30,10,"x",$2
  149.   GTCheckBox 0,1,0,11,30,10,"y",$2
  150.   GTCheckBox 0,2,0,22,30,10,"z",$2
  151.   GTSlider   0,3,0,33,30,10,"Depth",$2,0,320,320
  152.   GTSlider   0,4,0,44,30,10,"x-pos",$2,0,win_width,win_width/2
  153.   GTSlider   0,5,0,55,30,10,"y-pos",$2,0,win_height,win_height/2
  154.   AttachGTList 0,0
  155.  
  156.   Window 1,110,10,win_width,win_height,$400,"",0,1
  157.  
  158. Repeat
  159.  
  160.   a.l = Event
  161.   Select a
  162.     Case #IDCMP_CLOSEWINDOW
  163.       QUIT.b = True
  164.  
  165.     Case #IDCMP_GADGETUP
  166.       gadget.b = GadgetHit
  167.       code.w = EventCode
  168.       If gadget < 3                       ; x/y/z-rotation yes/no
  169.         Axis_Active(gadget) = code
  170.       Else
  171.         If gadget = 3                     ; perspective value
  172.           perspectivedepth = code
  173.         Else
  174.           XY_Origin(gadget-4) = code        ; x-y-origin
  175.         EndIf
  176.       EndIf
  177.  
  178.   End Select
  179.  
  180.   If Axis_Active(0) Then World\xang + 0.05
  181.   If Axis_Active(1) Then World\yang + 0.05
  182.   If Axis_Active(2) Then World\zang + 0.05
  183.  
  184.   UpdateWorld  {}
  185.   UpdateObject {XY_Origin(0), XY_Origin(1)}
  186.   UpdatePerspective {perspectivedepth}
  187.  
  188.   WCls
  189.   DrawObject   {}
  190.  
  191. Until QUIT = True
  192.  
  193. End
  194.  
  195. ;*******************************************
  196.  
  197. cube:
  198.   Data.w     35, 35,-35
  199.   Data.w    -35, 35,-35
  200.   Data.w    -35,-35,-35
  201.   Data.w     35,-35,-35
  202.   Data.w    -35,-35, 35
  203.   Data.w     35,-35, 35
  204.   Data.w     35, 35, 35
  205.   Data.w    -35, 35, 35
  206.  
  207.